package com.qf.smsplatform.strategy.service.impl;

import com.qf.smsplatform.common.constants.CacheConstants;
import com.qf.smsplatform.common.constants.StrategyConstants;
import com.qf.smsplatform.common.model.StandardSubmit;
import com.qf.smsplatform.strategy.service.Strategy;
import com.qf.smsplatform.strategy.service.api.CacheService;
import com.qf.smsplatform.strategy.util.PushMsgUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.Set;

/**
 * 5分钟的限流策略/流量控制，5分钟之内对多发送3条短信
 */
@Service(value = "limitFiveMinutes")
@Slf4j
public class LimitFiveMinutesStrategy implements Strategy {

    @Autowired
    private CacheService cacheService;

    @Autowired
    private PushMsgUtil pushMsgUtil;

    @Override
    public boolean strategy(StandardSubmit submit) {
        log.info("【策略模块】 5分钟内的限流策略开始执行！！！");
        // 获取客户ID和目标手机号，组成key
        int clientID = submit.getClientID();
        String destMobile = submit.getDestMobile();
        // 如果需要校验短信内容内容相同的问题,再给key添加个前缀,短信内容
        String key = CacheConstants.CACHE_PREFIX_SMS_LIMIT + clientID + ":" + destMobile;

        // 获取发送时间的毫秒值,和5分钟之前的毫秒值
        long sendTime = new Date().getTime();
        long fiveMinuteBefore = sendTime - 1000 * 60 * 5;

        // 调用缓存模块，查询近5分钟之内，发送过几条短信
        Set<String> value = cacheService.zRangeByScore(key,fiveMinuteBefore,sendTime);

        // 判断发送条数
        if(value != null && value.size() >= 3){
            //已经超过限流要求。记录日志，发送消息，return false
            log.info("【策略模块】 5分钟内的限流策略执行失败。。。");
            pushMsgUtil.sendLog(submit, StrategyConstants.STRATEGY_ERROR_LIMIT);
            pushMsgUtil.pushReport(submit, StrategyConstants.STRATEGY_ERROR_LIMIT);
            return false;
        }else{
            // 没有超过限流要求。 记录日志，return true
            log.info("【策略模块】 5分钟内的限流策略执行成功！！！");
            return true;
        }
    }
}
